#ifndef __MENU_H
#define __MENU_H
#include "main.h" // Device header
#include <string.h>
#include "OLED.h"
// #include "Encoder.h"
// #include "Key.h"

#include "Game_Snake.h"
#include "game_of_life.h"

#define WORD_H 16	   // 字高word height
#define STRIPY_SHOW 18 // 进度条弹窗 显示
#define STRIPY_HIDE 70 // 进度条弹窗 隐藏

enum CursorStyle
{
	reverse, // 取反
	mouse,	 // 光标
	frame,	 // 边框
};

/**********************************************************/
typedef struct Menu
{
	char *Name;			// 选项名字
	void (*func)(void); // 函数指针
	struct Menu *Next;	// 绑定的菜单节点
	uint8_t NameLen;	// 由于中文占三个字节,用strlen计算名字宽度不再准确,故需额外储存名字宽度 名字的长度
	uint16_t Data;		// 数据
} Menu_t;

#if 0
typedef enum
{
	ESC_FLAG, // 返回标志
	EVENT,	  // 事件
	WINDOW,	  // 弹窗
	MENU,	  // 菜单
} mType_E;

typedef struct Menu1
{
	char *mName;		 // 选项名字
	struct Menu1 *mNext; // 下一个菜单
	uint8_t mNameLen;	 // 名字的长度
	uint16_t mData;		 // 数据
} Menu_tt;
#endif

extern enum CursorStyle CurStyle;
extern int8_t CursorRollSpeed; // 光标动画速度;
extern float MenuRollSpeed;	   // 滚动动画速度;
extern Menu_t *SetRunList;

extern float StripY_Next;	  // 进度条弹窗 目标 Y轴坐标
extern uint8_t DataAlterFlag; // 数据改动标志位

/**********************************************************/
int8_t menu_Roll_event(void);
int8_t menu_Enter_event(void);
int8_t menu_Back_event(void);

uint8_t Get_NameLen(char *String);
void OLED_Menu_Init(Menu_t *option);

void OLED_Menu_Show(Menu_t *option);
void OLED_Menu_Set_RunListFlag(uint8_t flag);
uint8_t OLED_Menu_Get_RunListFlag(void);
void OLED_Desktop_Show(void (*event)(void));
void OLED_DataAlter_Show(Menu_t *option);
void OLED_Enter_Menu(Menu_t *obj);
void OLED_Menu_Handle(void);
uint8_t update_Data(char *name, uint16_t data);

/**********************************************************/

void MenuVI_Chief_Esc(void);
void MenuVII_Debug_Enter(void);

/**********************************************************/

#endif
